/**
 * 第二课，变量的声明
 */
class demo2 {
    constructor() {
        // 声明变量，我们可以使用
        let name = '张三';
        const PI = 3.14;
        console.log(name, PI);
    }
}
let a = 20;
console.log(a); //20
// 典型的闭包函数
function f() {
    let a = 10;
    console.log(a);//10
    return function g() {
        let b = a + 1;
        return b;
    }
}
let g = f();
console.log(g());//11

function ff(val: boolean) {
    if (val) {
        var a = 10;
    }
    return a;
}
console.log(ff(false));//undefined
console.log(ff(true));//10

// function ff(val:boolean){
//     // 通过var定义了一个变量a，但并未赋值，所以当前a的值为undefined；
//     var a;
//     if(val){
//         // 只有当val的值为真时，才赋值a为10；
//         a = 10;
//     }
//     return a;
// }
// function f3() {
//     // 定义的一个变量a
//     var a = 32;
//     // 重复定义变量a并赋值为一个函数
//     var a = function () {
//         var a = 32;
//         return a + 2;
//     }
//     // 返回a函数
//     return a();
// }
// f3(); // 34

function f1(input: true) {
    let a = 1;
    if (input) {
        let a = 3;
        let b = 2;
    }
    // return b;//此时不能被访问到，let作为块级作用域下，不能访问到if代码块中使用let定义的变量
    return a;
}

function foo() {
    // 以下输出3次3
    for (var i = 0; i < 3; i++) {
        // 传给setTimeout的每一个函数表达式实际上都引用了相同作用域里的同一个i
        setTimeout(function () { console.log(i); }, 100 * i);
    }
    // 要想输出0,1,2。可以通过闭包的形式来解决
    for (var i = 0; i < 10; i++) {
        (function (i) {
            setTimeout(function () { console.log(i); }, 100 * i);
        })(i);
    }
}
// foo();//输出0,1,2
function foo1() {
    for (let i = 0; i < 3; i++) {
        setTimeout(function () { console.log(i); }, 100 * i);
    }
}


function fun() {
    console.log(num);
}
let num = 3;
let [fir, sub] = [1, 3];
console.log(fir, sub); // 1,3
let { b, c } = { b: 4, c: 6 };
console.log(b, c);//b:4 c:6
let [d, ...e] = [1, 2, 3, 4, 5];
console.log(d, e);//d:1,e:[2,3,4,5]

function fun1([a, b]: [number, number]) {
    console.log(a, b); // a:1 b:2
}
fun1([1, 2]);

let o = {
    n: "foo",
    v: 12,
};
// let { n,v } = o;
// 下面这个解构跟es6中的对象解构一致，冒号前面的是o对象中的键，冒号后面的是才是所定义的变量（理解为）
let { n: h, v: j } = o;
console.log(h, j); // h:'foo' j:12


